/**
  @file     	DESIGNPATTERN_Entry.h
  @brief    	1.When the algorithm to create complex object should be independent of the part of the object, 
                  as well as their assembly;
				2.When construction process must be allowed to construct the object is different;
  @author  	arvin
  @version 	1.0   2012/12/20
 */

#ifndef CXX_DESIGNPATTERN_ENTRY_H
#define CXX_DESIGNPATTERN_ENTRY_H
#include <string>

using namespace std;
class Entry
{
public:
	enum ENTRY_TYPE
	{
		ENTRY_NONE = 0,
		ENTRY_FILE,
		ENTRY_DIRECTORY,

		ENTRY_ALL,
		ENTRY_INVALID,
	};
	static const string STATIC_CONST_STRING_ENTRY[ENTRY_ALL];

	/**
	* Destruction
	*
	* @param VOID
	* @return
	*/
	virtual ~Entry();

	/**
	* PrintList
	*
	* @param VOID
	* @return VOID
	*/
	virtual VOID PrintList();

	/**
	* GetEntry
	*
	* @param VOID
	* @return ENTRY_TYPE
	*/
	ENTRY_TYPE GetEntry();

	/**
	* GetName
	*
	* @param VOID
	* @return string
	*/
	string GetName();

	/**
	* GetSize
	*
	* @param VOID
	* @return int
	*/
	virtual int GetSize();
protected:
	/**
	* Construction
	*
	* @param ENTRY_TYPE eEntry
	* @param const string& strName
	* @param int iSize
	* @return
	*/
	Entry(ENTRY_TYPE eEntry, const string& strName, int iSize);

	/**
	* SetEntry
	*
	* @param ENTRY_TYPE eEntry
	* @return
	*/
	VOID SetEntry(ENTRY_TYPE eEntry);

	/**
	* SetName
	*
	* @param const string& strName
	* @return
	*/
	VOID SetName(const string& strName);

	/**
	* SetSize
	*
	* @param int iSize
	* @return
	*/
	VOID SetSize(int iSize);
private:
	/**
	* Construction
	*
	* @param VOID
	* @return
	*/
	Entry();

	/**
	* Copy Construction
	*
	* @param const Entry& cEntry
	* @return
	*/
	Entry(const Entry& cEntry);

	/**
	* Assignment
	*
	* @param const Entry& cEntry
	* @return Entry&
	*/
	Entry& operator=(const Entry& cEntry);

public:
protected:
private:
	ENTRY_TYPE m_eEntry;
	string m_strName;
	int m_iSize;
};

#endif	/* >>CXX_DESIGNPATTERN_ENTRY_H<< */
/* EOF */